import pickle
import os

from .card import Card
from .user import User

#主要操作类
class Operation():
    users={}   #存储的所有用户
    usersid={} #存储的身份证和卡号

    def __init__(self):
        #检测存储文件是否存在
        if os.path.exists('./database/user.txt'):
            with open('./database/user.txt','rb') as fp:
                self.users=pickle.load(fp)
        else:
            self.users={}
        print(self.users)

        if os.path.exists('./database/userid.txt'):
            with open('./database/userid.txt','rb')as fp:
                self.usersid=pickle.load(fp)
        else:
            self.users={}
        print(self.usersid)

    #save()  按0，退出并存储数据到文件中
    def save(self):
        with open('./database/user.txt','wb') as fp:
            pickle.dump(self.users,fp)
        with open('./database/userid.txt','wb') as fp:
            pickle.dump(self.usersid,fp)

    # register() 按1，注册，开卡
    def register(self):
        username=self.get_username()
        userid=self.get_userid()
        phone=self.get_phone()
        #获取密码
        password=self.get_pwd()
        print(username,userid,phone,password)
        #开卡
        cardid=self.get_cardid()
        #创建卡
        cardobj=Card(cardid,password)
        #创建用户
        userobj=User(username,userid,phone,cardobj)
        #把当前用户存入到users属性中
        self.users[cardid]=userobj
        self.usersid[userid]=cardid

        #创建成功
        print(f'开卡成功，用户名为:{username},卡号为:{cardid}，余额为:{Card.money}')

    #query() 按2  查询余额功能
    def query(self):
        res=self.check_cardid()
        if res == False:
            pass
        else:
            # 返回当前余额
            if self.check_pwd(res):
                print(f'您的卡号：{res.cardid},余数为：{res.money}元')

    #save_money() 按3  存钱
    def save_money(self):
        cardid1 = input('输入您的卡号！')
        res = self.check_cardid()
        if res == False:
            pass
        else:
            if self.check_pwd(res):
                num=float(input('请输入要存入的金额'))
                res.money=float(res.money)+num
                print(f'您的卡号：{cardid1},余数为：{res.money}元')

    #get_money()  按4   取钱
    def get_money(self):
        while True:
            cardid1 = input('输入您的卡号！')
            res = self.check_cardid()
            if res==False:
                break
            else:
                if self.check_pwd(res):
                    num = float(input('请输入要取出的金额'))
                    res.money=float(res.money)-num
                    if res.money>=0:
                        print(f'您的卡号：{cardid1},余数为：{res.money}元')
                        break
                    else:
                        print('余额不足')
                        print('输入q为查询余额，输入s为查询存入金额,输入t退出')
                        xuanze = input('请输入选项：')
                        if xuanze == 'q':
                            return self.query()
                        elif xuanze == 's':
                            return self.save_moner()
                        elif xuanze == 't':
                            return self.save()

    #trans_money()  按5  转账
    def trans_money(self):
        while True:
            cardid1 = input('输入您的卡号！')
            res = self.check_cardid()
            num = float(input('请输入要转出的金额'))
            if res==False:
                break
            else:
                if self.check_pwd(res):
                    res.money = float(res.money) - num
                    print(res.money)
                    if res.money >= 0:
                        print(f'您的卡号：{cardid1},余数为：{res.money}元')
                    else:
                        print('余额不足')
                        print('输入q为查询余额，输入s为查询存入金额,输入t退出')
                        xuanze=input('请输入选项：')
                        if xuanze=='q':
                            return self.query()
                        elif xuanze=='s':
                            return self.save_moner()
                        elif xuanze == 't':
                            return self.save()
            cardid = input('输入您要转账的卡号！')
            # 验证当前卡是否存在，及锁卡
            if cardid not in self.users.keys():
                print('当前卡不存在')
                break
            else:
                # 检测当前卡 状态 {'卡号':用户对象：card对象}
                userobj = self.users[cardid]
                cardobj = userobj.card
                if cardobj.islock:
                    print('当前卡已被锁定')
                    print('输入u为解卡，输入t退出')
                    xuanze = input('请输入选项：')
                    if xuanze == 'u':
                        return self.unlock()
                    elif xuanze == 't':
                        return self.save()
                else:
                    # 返回当前余额
                    # 检测当前密码
                    if self.check_pwd(cardobj):
                        cardobj.money=float(cardobj.money)+num
                        print(f'您的卡号：{cardid},余数为：{cardobj.money}元')
                        break
                    else:
                        break

    #change_pwd()   按6   修改密码
    def change_pwd(self):
        res = self.check_cardid()
        if res == False:
            pass
        else:
            if self.check_pwd(res):
                new_pwd=input('请输入新密码：')
                res.password=new_pwd
                print('密码修改成功')

    #lock()  按7   锁卡
    def lock(self):
        res = self.check_cardid()
        if res == False:
            pass
        else:
            if self.check_pwd(res):
                res.islock=True
                print('已锁卡')

    #unlock()  按8   解卡
    def unlock(self):
        cardid = input('输入您要解锁的卡号！')
        # 验证当前卡是否存在，及锁卡
        if cardid not in self.users.keys():
            print('当前卡不存在')
            pass
        else:
            # 检测当前卡 状态 {'卡号':用户对象：card对象}
            userobj = self.users[cardid]
            cardobj = userobj.card
            if cardobj.islock:
                cardobj.islock=False
                print('当前卡已被解锁')

    #new_card()  按9  补卡
    def new_card(self):
        a_userid=input('请输入你的身份证号')
        if a_userid in self.usersid.keys():
            cardid=self.get_cardid()            #生成新的卡号
            o_cardid=self.usersid[a_userid]         #根据身份证的键获取卡号
            self.users[cardid]=self.users.get(o_cardid)  #将原本卡号的值，赋给新的卡号
            self.users.pop(o_cardid)        #删除旧的卡号的值
            self.usersid.pop(a_userid)      #删除身份证对应的旧卡号
            self.usersid[a_userid] = cardid #将新的卡号赋给身份证
            print(f'补卡成功，您的卡号为{cardid}')
        else:
            print('该身份证没有办过卡')

    #验证用户名
    def get_username(self):
        while True:
            un=input('请输入用户名：')
            if un=='':
                print('用户名不能为空！')
            else:
                return un

    #验证身份证
    def get_userid(self):
        while True:
            ui=input('请输入用户身份证：')
            if ui=='':
                print('用户身份证不能为空！')
            else:
                if ui not in self.usersid.keys():
                    return ui
                else:
                    print('该用户已经注册过')
                    return self.get_userid()


    #验证电话
    def get_phone(self):
        while True:
            p=input('请输入用户电话：')
            if p=='':
                print('用户电话不能为空！')
            else:
                return p


    #获取用户密码
    def get_pwd(self):
        while True:
            pwd=input('请输入密码：')
            if pwd!='':
                repwd=input('请输入确认密码：')
                if pwd !=repwd:
                    print('两次密码不一致！')
                else:
                    return pwd
            else:
                print('密码不能为空！')

    #开一个新卡
    def get_cardid(self):
        #得到最大的卡号,+1
        try:
            maxcard_id=max(self.users.keys())
        except:
            maxcard_id='000000'
        cardid=str(int(maxcard_id)+1).zfill(6)
        return cardid

    # #检测当前卡的状态
    def check_cardid(self):
        cardid=input('输入您的卡号！')
        # 验证当前卡是否存在，及锁卡
        if cardid not in self.users.keys():
            print('当前卡不存在')
            return False
        else:
            # 检测当前卡 状态 {'卡号':用户对象：card对象}
            userobj = self.users[cardid]
            cardobj = userobj.card
            if cardobj.islock:
                print('当前卡已被锁定')
                return False
            else:
                # 检测当前密码
                return cardobj

    #检测密码是否存在,接收卡对象
    def check_pwd(self,cardobj):
        num=3
        while True:
            pwd=input('请输入您的密码')
            if pwd==cardobj.password:
                return True
            else:
                num-=1
                if num==0:
                    #锁卡
                    cardobj.islock=True
                    print('密码错误三次，你的卡已被锁定')
                    return False
                else:
                    print(f'密码错误，还有{num}次机会')

